/**
 * 分析一个类的所有特征，主要用于分析匿名类
 * @author xiaohuihui
 * @param {string} clsName 类名
 */
function printClass(clsName) {
    let result = ""
    // 反射相关类
    const Modifier = Java.classFactory.use("java.lang.reflect.Modifier")

    const JavaCls = Java.classFactory.use(clsName)
    const cl = JavaCls.class
    const supercl = JavaCls.$super.class

    // 类修饰符
    const modifiers = Modifier.toString(cl.getModifiers())
    if (modifiers.length > 0) {
        result += modifiers + " "
    }
    result += "class " + clsName
    // 继承关系
    if (supercl && supercl.getName() != "java.lang.Object") {
        result += " extends " + supercl.getName()
    }
    result += "\n{\n"

    // 构造方法
    const constructors = cl.getDeclaredConstructors();
    constructors.forEach(c => {
        const name = c.getName()
        result += "   "
        const modifiers = Modifier.toString(c.getModifiers());
        if (modifiers.length > 0) {
            result += modifiers + " "
        }
        result += clsName + "("

        // 打印参数类型
        const paramTypes = c.getParameterTypes()
        for (let i = 0; i < paramTypes.length; i++) {
            if (i > 0) {
                result += ", "
            }
            result += paramTypes[i].getName()
        }
        result += ");\n"
    });

    // 打印方法
    const methods = cl.getDeclaredMethods()
    methods.forEach(m => {
        const retType = m.getReturnType() // 返回值类型
        const name = m.getName() // 方法名
        result += "   "
        const modifiers = Modifier.toString(m.getModifiers())
        if (modifiers.length > 0) {
            result += modifiers + " " // 修饰符
        }
        result += retType.getName() + " " + name + "("

        const paramTypes = m.getParameterTypes() // 参数列表
        for (let i = 0; i < paramTypes.length; i++) {
            if (i > 0) {
                result += ", "
            }
            result += paramTypes[i].getName()
        }
        result += ");\n"
    })

    // 打印属性
    const fields = cl.getDeclaredFields()
    fields.forEach(f => {
        const type = f.getType()
        const name = f.getName()
        result += "   "
        const modifiers = Modifier.toString(f.getModifiers())
        if (modifiers.length > 0) {
            result += modifiers + " " // 修饰符
        }
        result += type.getName() + " " + name + ";\n"
    })
    result += "}\n"
    console.log(result)
}
function inspectObject(clzz) {
    //todo 分析一个类对象的属性值，这里返回一个对象的属性列表
    var tmp_clzz = clzz
    var clazz = Java.use("java.lang.Class");
    var fields = Java.cast(tmp_clzz.getClass(), clazz).getDeclaredFields();
    return fields
}
export { printClass }